package com.qf.traveller.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Map;

import com.qf.traveller.utils.ImageAsyncTask.ImageCallback;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
/**
 * 图片处理工具类
 * */
public class BitmapUtils {
	/**
	 * 图片的二次采样
	 */
	public static Bitmap getScaleBitmap(byte[] data, int newwidth, int newheight) {
		// 1.得到用来设值图片属性参数的对象
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 2.解码边缘
		options.inJustDecodeBounds = true;
		// 3进行图片解码
		BitmapFactory.decodeByteArray(data, 0, data.length, options);
		// 4.获取原来图片的宽高
		double oldwidth = options.outWidth;
		double oldheigth = options.outHeight;
		// 5.得到压缩的比例
		double scaleWidth = oldwidth / newwidth;
		double scaleHeight = oldheigth / newheight;
		// 6.取出宽高缩放比例当中较大的一个作为缩放比例
		int scale = (int) Math.round(scaleHeight > scaleWidth ? scaleHeight
				: scaleWidth);

		// 7.设置缩放比例，只能设置大于1的整数，数越大，缩的越小
		options.inSampleSize = scale;
		// 8.锁住边缘
		options.inJustDecodeBounds = false;
		// 9.通过参数获得新的位图
		Bitmap bm = BitmapFactory
				.decodeByteArray(data, 0, data.length, options);
		return bm;
	}

	public static Bitmap getScaleBitmap(Bitmap bm, int newwidth, int newheight) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(CompressFormat.JPEG, 100, baos);
		return getScaleBitmap(baos.toByteArray(), newwidth, newheight);
	}

	public static Bitmap getScaleBitmap(Bitmap bm, int samplesize) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(CompressFormat.JPEG, 100, baos);
		byte[]data = baos.toByteArray();
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 2.解码边缘
		options.inJustDecodeBounds = true;
		// 3进行图片解码
		BitmapFactory.decodeByteArray(data, 0, data.length, options);
		options.inSampleSize = samplesize;
		// 4.锁住边缘
		options.inJustDecodeBounds = false;
		// 5.通过参数获得新的位图
		Bitmap bitmap = BitmapFactory
				.decodeByteArray(data, 0, data.length, options);
		return bitmap;
	}
	
	public static Bitmap getScaleBitmap(byte[]data, int samplesize) {
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 2.解码边缘
		options.inJustDecodeBounds = true;
		// 3进行图片解码
		BitmapFactory.decodeByteArray(data, 0, data.length, options);
		options.inSampleSize = samplesize;
		// 4.锁住边缘
		options.inJustDecodeBounds = false;
		// 5.通过参数获得新的位图
		Bitmap bitmap = BitmapFactory
				.decodeByteArray(data, 0, data.length, options);
		return bitmap;
	}
	
	/**
	 * @des 专门加载图片，并且显示在imageview当中
	 * @params map:存储图片的集合
	    
		强引用缓存：  即使程序内存溢出了，垃圾回收器也不会回收的缓存，就是强引用缓存。
		缓存使用LruCache而不用HashMap的原因？
		LruCache和HashMap都是强引用缓存。
		1.HashMap可以一致存储数据到内存缓存中，没有上限，直到程序崩溃为止。
		  而LruCache可以设置最大的内存空间，而且同时内部的最近最少使用算法，会自动的回收不常用的内存空间。

	 * 		
	 * */
	public static void loadImage(final Context context,final Map<String, Bitmap> map, String iconUrl,
			final ImageView icon, final int sampleSize) {
		
		if (map.containsKey(iconUrl)) {
			icon.setImageBitmap(map.get(iconUrl));
		} else {
			// 如果图片存在在sd卡缓存目录中，就加载目录中的结果，如果没有就下载，并存储
			// 获取文件的名称
			final String fileName = iconUrl
					.substring(iconUrl.lastIndexOf("/") + 1);
			// 获取文件存储的决定路径 /mnt/sdcard/Android/<你的包名>/cache/
			String filePath = context.getExternalCacheDir().getAbsolutePath()
					+ File.separator + fileName;
			// 获取指定目录下的文件
			byte[] data = SDCardHelper.loadFileFromSDCard(filePath);

			if (data == null) { // 指定目录下没有此文件
				new ImageAsyncTask(context, new ImageCallback() {
					@Override
					public void sendImage(Bitmap bm, String path) {
						String tag = (String) icon.getTag();
						if (tag.equals(path) && tag != null) {
							icon.setImageBitmap(bm);
							map.put(path, bm);
							// 下载图片到sd卡的缓存目录当中
							SDCardHelper.saveBitmapToSDCardCacheDir(bm,
									fileName, context);
						}
					}
				},sampleSize).execute(iconUrl);
			} else {
				// 如果指定目录下有数据，直接显示出来
				Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
				icon.setImageBitmap(bm);
				map.put(iconUrl, bm);
			}
		}
	}
}
